# -*- coding: utf-8 -*-
import pandas as pd
import openai
from tkinter import filedialog, messagebox
from tkinter import ttk
import threading
import csv
import tkinter as tk

# API 接口设置部分
api_key = "sk-J7sdDJr7HHBMvAg2736e9800863f40Fe81E64b87782bF1Fe"
api_base = "https://api.xiaoai.plus/v1"

openai.api_key = api_key
openai.api_base = api_base

# 设置主应用程序窗口
root = tk.Tk()
root.title("博客生成工具")
root.geometry("600x700")
root.resizable(True, True)

# 全局变量
file_path = tk.StringVar()  # 保存选中的Excel路径
available_columns = []  # 保存Excel文件中的列名
title_column = tk.StringVar()  # 用户选择的标题列
content_column = tk.StringVar()  # 用户选择的内容列（可选）

# AI训练文档内容
ai_training_document = """
你是尼古丁类产品推广的专家，你擅长撰写高质量的美国本土化的英文博客文章。我们的产品推广网站Echi网址为：https://snuffmint.com WhatsAPP:+852-90568182 ,你的任务是根据给定的博客标题生成内容丰富、结构清晰、符合SEO优化的博客文章，在文章的关键词的位置插入链接，关键词例如:Nicotine（链接地址：https://snuffmint.com）,Nicotine Pouches（链接地址：https://snuffmint.com/en/product-category/fashion-series-nicotine_pouches/）等与尼古丁有关的热点词（链接地址：https://snuffmint.com/en/shop/）,每篇文章插入5个左右的链接；注意：你只需要输出适用于wordpress经典编辑器的HTML格式文本，标题不要包含在博客正文中且拒绝输出其他与博客正文无关的信息。
博客正文段落标签采用范围为H2-H4，并为H2-H4标签定义合适的字体大小，确保博客文章的整体视觉效果美观且内容丰富，文章字数不小于3000。
"""

# 函数：生成博客内容
def generate_blog(title, initial_content, system_message, user_instruction):
    prompt = f"Title: {title}\n"
    if initial_content:
        prompt += f"Initial Content: {initial_content}\n"
    prompt += user_instruction

    try:
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": system_message},
                {"role": "user", "content": prompt}
            ]
        )
        return response['choices'][0]['message']['content']
    except Exception as e:
        print(f"API调用错误: {e}")
        return None

# 函数：处理博客文件并生成CSV内容（在新线程中运行）
def process_file_thread(save_path):
    try:
        # 确保 file_path 是有效路径
        path = file_path.get()
        if not path:
            messagebox.showerror("错误", "请选择一个Excel文件。")
            return

        # 读取Excel文件
        df = pd.read_excel(path)

        # 获取用户选择的列
        selected_title_column = title_column.get()
        selected_content_column = content_column.get() if content_column.get() else None

        # 检查列是否有效
        if selected_title_column not in df.columns:
            messagebox.showerror("错误", f"标题列 '{selected_title_column}' 无效。")
            return

        # 如果用户选择了内容列，也要检查其有效性
        if selected_content_column and selected_content_column not in df.columns:
            messagebox.showerror("错误", f"内容列 '{selected_content_column}' 无效。")
            return

        # 获取系统消息和用户指令
        system_message = ai_training_document  # 使用AI训练文档作为系统消息
        user_instruction = user_instruction_entry.get("1.0", tk.END).strip()

        # 准备CSV写入
        with open(save_path, mode='w', newline='', encoding='utf-8') as csv_file:
            writer = csv.writer(csv_file)
            writer.writerow(['post_title', 'post_content'])  # 写入标题和内容列（WordPress要求）

            total_rows = len(df)
            progress_bar['maximum'] = total_rows  # 设置进度条最大值

            # 遍历Excel数据并生成内容
            for i, row in df.iterrows():
                title = row[selected_title_column]
                initial_content = row[selected_content_column] if selected_content_column else None
                try:
                    # 生成博客内容
                    blog_content = generate_blog(title, initial_content, system_message, user_instruction)

                    if blog_content:
                        # 写入CSV文件（WordPress导入格式）
                        writer.writerow([title, blog_content])

                    # 更新进度条
                    progress_bar['value'] = i + 1
                    root.update_idletasks()
                except Exception as e:
                    print(f"生成《{title}》博客内容时出错：{e}")
                    continue

            messagebox.showinfo("完成", "所有生成的博客内容已保存为CSV文件。")

    except Exception as e:
        messagebox.showerror("错误", f"处理文件时出错：{e}")
    finally:
        progress_bar['value'] = 0  # 重置进度条

# 函数：启动线程来处理文件
def start_process_file():
    save_path = filedialog.asksaveasfilename(
        defaultextension=".csv",
        filetypes=[("CSV files", "*.csv")],
        title="保存生成的博客"
    )
    if save_path:
        thread = threading.Thread(target=process_file_thread, args=(save_path,))
        thread.start()
    else:
        messagebox.showinfo("取消", "未选择保存路径。")

# 函数：加载Excel文件并提取列名
def load_excel():
    global available_columns
    path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")])

    if path:
        try:
            df = pd.read_excel(path)
            available_columns = df.columns.tolist()

            # 更新下拉菜单选项
            title_column_combo['values'] = available_columns
            content_column_combo['values'] = available_columns
            file_path.set(path)

            messagebox.showinfo("成功", "Excel文件加载成功！")
        except Exception as e:
            messagebox.showerror("错误", f"加载Excel文件时出错：{e}")
    else:
        messagebox.showerror("错误", "未选择Excel文件。")

# GUI组件布局
dynamic_frame = tk.Frame(root)
dynamic_frame.pack(pady=10)

ttk.Button(dynamic_frame, text="加载 Excel 文件", command=load_excel).pack(pady=5)

ttk.Label(dynamic_frame, text="选择标题列：").pack(pady=5)
title_column_combo = ttk.Combobox(dynamic_frame, textvariable=title_column)
title_column_combo.pack(pady=5)

ttk.Label(dynamic_frame, text="选择内容列（可选）：").pack(pady=5)
content_column_combo = ttk.Combobox(dynamic_frame, textvariable=content_column)
content_column_combo.pack(pady=5)

# 合并系统消息和用户指令为一个输入框，默认填充AI训练文档内容
ttk.Label(dynamic_frame, text="输入系统消息与用户指令：").pack(pady=5)
user_instruction_entry = tk.Text(dynamic_frame, height=10, width=50)
user_instruction_entry.insert(tk.END, ai_training_document)  # 默认填充AI训练文档内容
user_instruction_entry.pack(pady=5)

ttk.Button(dynamic_frame, text="生成博客内容", command=start_process_file).pack(pady=20)

progress_bar = ttk.Progressbar(dynamic_frame, orient="horizontal", length=400, mode="determinate")
progress_bar.pack(pady=20)

# 运行主循环
root.mainloop()
